/*-----------------------------------------------------------------------
 * ascii.h
 *
 *	 Portions Copyright (c) 1999-2022, PostgreSQL Global Development Group
 *
 * src/include/utils/ascii.h
 *
 *-----------------------------------------------------------------------
 */

#ifndef _ASCII_H_
#define _ASCII_H_

extern void ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz);

/*
 * 验证一块字节的有效 ASCII。
 *
 * 如果输入中包含任何零字节或高位被设置的字节，则返回 false。输入长度必须是 8 的倍数。
 */
static inline bool
is_valid_ascii(const unsigned char *s, int len)
{
	uint64		chunk,
				highbit_cum = UINT64CONST(0),
				zero_cum = UINT64CONST(0x8080808080808080);

	Assert(len % sizeof(chunk) == 0);

	while (len > 0)
	{
		memcpy(&chunk, s, sizeof(chunk));

		/*
		 * 捕获此块中的任何零字节。
		 *
		 * 首先，将 0x7f 添加到每个字节。这会在每个字节中设置高位，
		 * 除非它是零。如果任何结果高位为零，零累加器中的
		 * 相应高位将被清除。
		 *
		 * 如果块中的字节都没有设置高位，则添加后的
		 * 每个字节的最大值为 0x7f + 0x7f = 0xfe，
		 * 我们不需要担心进位到下一个字节。如果
		 * 任何输入字节确实设置了高位，这也没关系，
		 * 因为我们会单独检查这些。
		 */
		zero_cum &= (chunk + UINT64CONST(0x7f7f7f7f7f7f7f7f));

		/* 捕获此块中的任何设置位。 */
		highbit_cum |= chunk;

		s += sizeof(chunk);
		len -= sizeof(chunk);
	}

	/* 检查高位累加器中的任意高位是否被设置。 */
	if (highbit_cum & UINT64CONST(0x8080808080808080))
		return false;

	/* 检查零累加器中的任意高位是否被清除。 */
	if (zero_cum != UINT64CONST(0x8080808080808080))
		return false;

	return true;
}

#endif							/* _ASCII_H_ */
